package br.com.viewcar.web.bean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.faces.model.SelectItem;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.viewcar.entity.Cliente;
import br.com.viewcar.entity.Grupo;
import br.com.viewcar.entity.Permissao;
import br.com.viewcar.entity.Veiculo;
import br.com.viewcar.service.GrupoService;
import br.com.viewcar.service.PermissaoService;
import br.com.viewcar.service.VeiculoService;

@Scope("session")
@Component("grupoBean")
public class GrupoBean extends EntityBean<Integer, Grupo> {

	@Autowired
	private GrupoService service;

	@Autowired
	private PermissaoService permissaoService;

	@Autowired
	private VeiculoService veiculoService;

	private Permissao permissao;

	private Veiculo veiculo;

	private Integer veiculosClienteId;

	protected Integer retrieveEntityId(Grupo entity) {

		return entity.getId();
	}

	protected GrupoService retrieveEntityService() {

		return this.service;
	}

	protected Grupo createNewEntity() {

		Grupo grupo = new Grupo();
		grupo.setPermissoes(new ArrayList<Permissao>());
		grupo.setCliente(new Cliente());
		return grupo;
	}

	public List<SelectItem> getListaGrupos() {

		List<SelectItem> result = new ArrayList<SelectItem>();
		List<Grupo> grupos =  service.retrieveAll();
		for (Grupo grupo : grupos) {
			result.add(new SelectItem(grupo.getId(), grupo.getNome()));
		}
		return result;
	}

	public Permissao getPermissao() {
		if (permissao == null) {
			permissao = new Permissao();
		}
		return permissao;
	}

	public Veiculo getVeiculo() {
		if (veiculo == null) {
			veiculo = new Veiculo();
		}
		return veiculo;
	}

	public void setPermissao(Permissao permissao) {

		this.permissao = permissao;
	}

	public void setVeiculo(Veiculo veiculo) {

		this.veiculo = veiculo;
	}

	public Integer getVeiculosClienteId() {

		return veiculosClienteId;
	}

	public void setVeiculosClienteId(Integer veiculosClienteId) {

		this.veiculosClienteId = veiculosClienteId;
	}

	public boolean isPermissaoStatus() {

		return getListaPermissoes().size() > 0;
	}

	public String addPermissao() {

		permissao = permissaoService.retrieve(permissao.getId());

		this.entity.getPermissoes().add(permissao);

		permissao = new Permissao();

		return SUCCESS;
	}

	public List<SelectItem> getListaPermissoes() {

		List<SelectItem> result = new ArrayList<SelectItem>();

		List<Permissao> permissoes = permissaoService.retrieveAll();

		Collections.sort(permissoes, new Comparator<Permissao>() {

			public int compare(Permissao o1, Permissao o2) {

				return o1.getDescricao().compareTo(o2.getDescricao());
			}
		});

		for (Permissao permissao : permissoes) {

			if (!this.entity.getPermissoes().contains(permissao)) {

				result.add(new SelectItem(permissao.getId(), permissao.getDescricao()));
			}
		}

		return result;
	}


	public String delPermissao() {

		this.entity.getPermissoes().remove(permissao);
		return SUCCESS;
	}

}